﻿using System;

//Si une classe contient au moins une méthode abstract, elle doit impérativement être déclarée en classe abstract
//Une classe abstract peut contenir des méthodes non abstraites et donc implantées dans la classe.
//Une classe abstract peut même ne pas contenir du tout de méthodes abstraites

//Une classe abstract ne peut pas être instanciée directement

abstract class clA
{
    public string nom = "inconnu";
    public int code = 999;

    public abstract int nombreLettres(); // méthode abstraite implicitement virtuelle 

    public void changerNom(string newNom)
    {
        nom = newNom;
        code = nombreLettres() * 100; // appel à la méthode abstraite
    }
}

class clB : clA
{
    public override int nombreLettres() // implantation par redéfinition virtuelle de la méthode abstraite
    {
        return this.nom.Length;
    }
}

class Exercice
{
    public static void Main(string[] args) // méthode principale de lancement de l'exécution
    {
        clB x = new clB();
        Console.WriteLine("x.nom = {0}, nbr lettres = {1}, code = {2}", x.nom, x.nombreLettres(), x.code);

        x.changerNom("Shakespeare");
        Console.WriteLine("x.nom = {0}, nbr lettres = {1}, code = {2}", x.nom, x.nombreLettres(), x.code);

        Console.ReadLine();
    }
}